package hxg.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author HeXiangGuang
 * @create 2021-06-23 17:42
 * 这种方式建立线程池不是很建议
 * 线程池不允许使用Executors去创建，而是通过ThreadPoolExecutor的方式，这样的处理方式让写的同学更加明确线程池的运行规则，规避资源耗尽的风险。 说明：Executors返回的线程池对象的弊端如下：
 * 1）FixedThreadPool和SingleThreadPool:
 *   允许的请求队列长度为Integer.MAX_VALUE，可能会堆积大量的请求，从而导致OOM。
 * 2）CachedThreadPool:
 *   允许的创建线程数量为Integer.MAX_VALUE，可能会创建大量的线程，从而导致OOM。
 * Executor:线程池的根接口,execute()
 * ExecutorService:包含管理线程池的一些方法， submit提交任务 shutdown结束任务
 *  ThreadPoolExecutor
 *      scheduledThreadPoolExecutor
 *  Executors:创建线程池的工具类
 *  (1)创建固定线程个数线程池
 *  (2)创建缓存线程池,由任务的多少决定
 *  (3)创建单线程池
 *  (4)创建调度线程池调度:周期、定时执行
 */
public class Demo1 {
    public static void main(String[] args) {

        //1.1创建固定线程个数的线程池
        ExecutorService es = Executors.newFixedThreadPool(4);
        //1.2创建缓存线程池，线程个数由任务个数决定
        //ExecutorService executorService = Executors.newCachedThreadPool();
        //1.3创建单线线程池
//        ExecutorService executorService = Executors.newSingleThreadExecutor();
        //1.4创建调度线程池调度:周期、定时执行
//         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
        //表示延迟3秒执行。
//         scheduledThreadPool.schedule(new Runnable() {
//
//
//              @Override
//
//              public void run() {
//
//                 log.info("delay 3 seconds");
//               }
//
//         }, 3, TimeUnit.SECONDS);
        Runnable runnable = new Runnable() {
            private int ticket = 100;
            @Override
            public void run() {
                while (true){
                    if (ticket <= 0){
                        break;
                    }
                    System.out.println(Thread.currentThread().getName() + "买了第" + ticket + "张票");
                    ticket --;
                }
            }
        };
        for (int i = 0; i < 4; i++) {
            es.submit(runnable);
        }
        es.shutdown();

    }
}
